//**************************************************************
//					新人研修用ソースプログラム	
//**************************************************************
//ファイル名：practice8-3.c						
//**************************************************************

//===========================						
//インクルード
//===========================
#include<stdio.h>

//===========================						
//マクロ
//===========================
#define exor(a, b) ((a)^(b))

//===========================						
//構造体・共用体定義
//===========================
// ビット入れ替え用構造体
typedef struct bit{
	char uu;	// 下位ビット格納用
	char ui;	// 上位ビット格納用
}s;
// エンディアン変換作業用構造体
typedef union endiannes{
	short data;
	s endi;
}u;	

//===========================						
//プロトタイプ宣言
//===========================
short endi_change(u* endiannes);
	
//*********************************************************************
//機能名称　：メイン関数
//
//関数名　　：int main(void)
//引数　　　：なし
//戻り値　　：常に0
//機能　　　：エンディアン変換された2バイトの数値を表示する。
//*********************************************************************	
int main (void){
	
	// 共用体宣言
	u bytes;
	
	// 変換前データ
	bytes.data = 0x1234;
	printf("bytes.data:0x%04X\n", bytes.data);

	// 変換作業関数へ渡した後、変換後データを表示
	printf("CHANGED   :0x%04X\n", endi_change(&bytes));
	
	return 0;
}

//*********************************************************************
//機能名称　：エンディアン変換関数
//
//関数名　　：short endi_change(u* endiannes)
//引数　　　：u* endiannes
//戻り値　　：short endiannes->data
//機能　　　：共用体を受け取りエンディアン変換作業をする。
//　　　　　：その後、変換作業後の数値を返す。
//*********************************************************************	
short endi_change(u* endiannes){
	// エンディアン変換
	endiannes->endi.uu = exor((endiannes->data & 0x00ff), ((endiannes->data >> 8) & 0x00ff));
	// printf("LOW:0x%02X\n", endiannes->endi.uu);
	// 上位ビット
	endiannes->endi.ui = exor((endiannes->endi.uu), ((endiannes->data >> 8) & 0x00ff));
	//printf("H:0x%02X\n", endiannes->endi.ui);
	// 下位ビット
	endiannes->endi.uu = exor((endiannes->endi.uu), (endiannes->endi.ui));
	//printf("L:0x%02X\n", endiannes->endi.uu);
	
	endiannes->data = ((endiannes->endi.ui << 8) | (endiannes->endi.uu));

	return endiannes->data;
}
